from alipay import AliPay
from django import http
from django.shortcuts import render

# Create your views here.
from django.views import View


from apps.orders.models import OrderInfo
from apps.payment.models import Payment
from meiduo_mall import settings
from utils.response_code import RETCODE

from utils.views import LoginRequiredJSONMixin

"""
1.创建应用(沙箱环境)
2.配置密钥
    两对公钥和私钥
    美多商场:
    支付宝:
3.下载SDK

4.按照文档开发
"""

"""
当登陆用户完成下单之后,选择支付宝之后的话,需要 前端收集 订单id给后端

后端:
    1.获取订单id
    2.根据订单id查询订单
    3.创建alipay实例对象
    4.生成order_string
    5.返回生成的url
请求的路由和方式
    GET payment/(?P<order_id>\d+)/
"""
class PaymentView(LoginRequiredJSONMixin,View):
    def get(self,request,order_id,):
        # 1.获取订单id
        # 2.根据订单id查询订单
        try:#为李让查询更准确，我们在添加俩参数，订单状态和用户信息
            order=OrderInfo.objects.get(order_id=order_id,
                                        user=request.user,
                                        status=OrderInfo.ORDER_STATUS_ENUM['UNPAID'])
        except OrderInfo.DoesNotExist:
            return http.JsonResponse({'code':RETCODE. NODATAERR,'errmsg':'查无此订单'})

        # 3.创建alipay实例对象
        app_private_key_string = open(settings.APP_PRIVATE_KEY_PATH).read()
        alipay_public_key_string = open(settings.ALIPAY_PUBLIC_KEY_PATH).read()

        alipay = AliPay(
            appid=settings.ALIPAY_APPID,
            app_notify_url=None,  # 默认回调url
            app_private_key_string=app_private_key_string,
            # 支付宝的公钥，验证支付宝回传消息使用，不是你自己的公钥,
            alipay_public_key_string=alipay_public_key_string,
            sign_type="RSA2",  # RSA 或者 RSA2
            debug=settings.ALIPAY_DEBUG  # 默认False
        )
        # 4.生成order_string
        subject = "美多商城%s" % order_id

        # 电脑网站支付，需要跳转到https://openapi.alipay.com/gateway.do? + order_string
        order_string = alipay.api_alipay_trade_page_pay(
            out_trade_no=order_id,
            total_amount=str(order.total_amount),  # 总金额，，，，，需要将货币类型转换为字符串
            subject=subject,
            return_url=settings.ALIPAY_RETURN_URL   #回调的ｕｒｌ
        )

        # alipay_url='https://openapi.alipaydev.com/gateway.do?'+order_string

        alipay_url = settings.ALIPAY_URL + '?' + order_string
    # 5返回生成的url

        return http.JsonResponse({'code':RETCODE.OK,'errmsg':'ok','alipay_url':alipay_url})
"""
    当我们支付完成之后,支付宝会将参数返回给我们
    我们需要获取参数,按照文档的要求对数据进行验证,就可以获取 支付宝交易流水号和商家订单id

    回调的路由中 有需要的参数,我们需要获取到参数
    http://www.meiduo.site:8000/payment/status/?charset=utf-8&
    out_trade_no=20190603035511000000001&　　　　　　
    method=alipay.trade.page.pay.return&
    total_amount=72102.00&
    sign=EE%2FHN5m4hMDws%2BWKW31XsqtUd88gGP0w%2F4eudX4BVuFo9KxjbQzKBMd24ay9D7tGb%2Bwz9LsARNUKhl%2FygS09akmu%2Fw%2BgjpiXWT%2Fyz5VSHtZG0LFzT%2Bm1p8mtT%2FiEl9fTgfccWdfaElY7D%2BK9GJW%2BjcHWVxypHYd5x0XkLxuMIB81E3xtszDkuvjViFks53nOcffG0ngyW724ZxluzprFrCriPQ2vsxv2Vxl4mkchMAfQi3NdVpFORtOOOjKZRy6afNNwLdG4wPHvgz4xmVuwfFfXmhGPGSqZezwmQ1n%2BL%2FkXQgswMcKkmJOd304JXvhLRN9ISxXp3nJugB1WT%2F%2FqMg%3D%3D&
    trade_no=2019060322001482791000021947&
    auth_app_id=2016092800616648&version=1.0&
    app_id=2016092800616648&
    sign_type=RSA2&
    seller_id=2088102177666677&
    timestamp=2019-06-03+16%3A08%3A56
"""

class PaymentStatusView(View):
    def get(self,request):
        #创建ａｌｉｐａｙ实例对象
        app_private_key_string = open(settings.APP_PRIVATE_KEY_PATH).read()
        alipay_public_key_string = open(settings.ALIPAY_PUBLIC_KEY_PATH).read()

        alipay = AliPay(
            appid=settings.ALIPAY_APPID,
            app_notify_url=None,  # 默认回调url
            app_private_key_string=app_private_key_string,
            # 支付宝的公钥，验证支付宝回传消息使用，不是你自己的公钥,
            alipay_public_key_string=alipay_public_key_string,
            sign_type="RSA2",  # RSA 或者 RSA2
            debug=settings.ALIPAY_DEBUG  # 默认False
        )
        #验证数据
        data = request.GET.dict()
        # sign 不能参与签名验证
        signature = data.pop("sign")

        # verifyo
        success = alipay.verify(data, signature)
        if success:
            # 我们就可以获取到 out_trade_no 和 trade_no
            """
            trade_no	String	必填	64	支付宝交易号	2019060322001482791000021947
            out_trade_no	String	必填	64	商户订单号	20190603035511000000001
            """''
            trade_no=data.get('trade_no')#支付宝
            out_trade_no=data.get('out_trade_no')#商家
            #订单结果保存
            Payment.objects.create(
                order_id=out_trade_no,
                trade_id=trade_no
            )

            #修改订单状态
            OrderInfo.objects.filter(order_id=out_trade_no).update(status=OrderInfo.ORDER_STATUS_ENUM['UNSEND'])
        context = {
            'trade_id': trade_no

        }
        return render(request,'pay_success.html',context=context )